package com.skycan.plc.adapter;

import com.skycan.plc.adapter.model.DataPoint;
import com.skycan.plc.adapter.model.DeviceInfo;
import com.skycan.plc.adapter.mqtt.MqttClient;
import com.skycan.plc.adapter.netty.NettyServer;
import com.skycan.plc.adapter.service.ControlService;
import com.skycan.plc.adapter.service.DataCollectionService;
import com.skycan.plc.adapter.service.DeviceService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 应用程序入口
 */
public class Main {
    private static final Logger logger = LoggerFactory.getLogger(Main.class);

    // 服务实例
    private static DeviceService deviceService;
    private static DataCollectionService dataCollectionService;
    private static ControlService controlService;
    private static NettyServer nettyServer;
    private static MqttClient mqttClient;

    // 应用程序运行标志
    private static volatile boolean running = true;

    public static void main(String[] args) {
        logger.info("启动PLC协议适配服务");

        try {
            // 初始化服务
            initServices();

            // 启动服务
            startServices();

            // 添加关闭钩子
            registerShutdownHook();

            // 命令行交互
            consoleCmdLoop();

        } catch (Exception e) {
            logger.error("服务启动异常", e);
        }
    }

    /**
     * 初始化服务
     */
    private static void initServices() {
        // 初始化设备服务
        deviceService = new DeviceService();

        // 初始化数据采集服务
        dataCollectionService = new DataCollectionService(deviceService);

        // 初始化控制服务
        controlService = new ControlService(deviceService);

        // 初始化MQTT客户端
        mqttClient = MqttClient.getInstance();

        // 初始化Netty服务器
        nettyServer = new NettyServer(deviceService);

        logger.info("服务初始化完成");
    }

    /**
     * 启动服务
     */
    private static void startServices() throws Exception {
        // 连接MQTT服务器
        if (mqttClient.connect()) {
            logger.info("MQTT服务连接成功");
        } else {
            logger.error("MQTT服务连接失败");
        }

        // 启动Netty服务器
        nettyServer.start();

        // 启动数据采集服务
        dataCollectionService.start();

        // 启动控制服务
        controlService.start();

        // 添加测试设备数据点（可选）
        addTestDevicePoints();

        logger.info("所有服务启动完成");
    }

    /**
     * 添加测试设备数据点
     */
    private static void addTestDevicePoints() {
        // 这里可以添加一些测试设备的数据点配置
        // 例如：为某个设备添加几个固定的数据点进行采集

        // 为了测试，这里可以添加一个示例
        String testDeviceId = "test-device-001";

        // 添加一些Modbus测试点
        Map<String, DataPoint.DataType> pointsMap = new HashMap<>();
        pointsMap.put("40001", DataPoint.DataType.AO); // 保持寄存器1，模拟量
        pointsMap.put("40002", DataPoint.DataType.AO); // 保持寄存器2，模拟量
        pointsMap.put("00001", DataPoint.DataType.DO); // 线圈1，数字量

        // 添加到采集服务
        dataCollectionService.addCollectionPoints(testDeviceId, pointsMap);

        logger.info("测试数据点添加完成");
    }

    /**
     * 注册关闭钩子
     */
    private static void registerShutdownHook() {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            logger.info("正在关闭服务...");

            running = false;

            // 停止控制服务
            if (controlService != null) {
                controlService.stop();
            }

            // 停止数据采集服务
            if (dataCollectionService != null) {
                dataCollectionService.stop();
            }

            // 关闭Netty服务器
            if (nettyServer != null) {
                nettyServer.shutdown();
            }

            // 断开MQTT连接
            if (mqttClient != null) {
                mqttClient.disconnect();
            }

            logger.info("服务已关闭");
        }));
    }

    /**
     * 命令行交互循环
     */
    private static void consoleCmdLoop() {
        Scanner scanner = new Scanner(System.in);
        logger.info("输入'quit'或'exit'退出程序");

        while (running) {
            System.out.print("> ");
            String command = scanner.nextLine().trim();

            if ("quit".equalsIgnoreCase(command) || "exit".equalsIgnoreCase(command)) {
                running = false;
                System.exit(0);
            } else if ("help".equalsIgnoreCase(command)) {
                printHelp();
            } else if ("devices".equalsIgnoreCase(command)) {
                printDevices();
            } else {
                System.out.println("未知命令，输入'help'查看帮助");
            }
        }
    }

    /**
     * 打印帮助信息
     */
    private static void printHelp() {
        System.out.println("可用命令:");
        System.out.println("  help    - 显示帮助信息");
        System.out.println("  devices - 显示已连接设备");
        System.out.println("  exit    - 退出程序");
    }

    /**
     * 打印已连接设备信息
     */
    private static void printDevices() {
        Map<String, DeviceInfo> devices = deviceService.getAllDeviceInfo();

        if (devices.isEmpty()) {
            System.out.println("当前没有已连接设备");
            return;
        }

        System.out.println("已连接设备列表:");
        for (DeviceInfo device : devices.values()) {
            System.out.printf("  ID: %s, IP: %s, 状态: %s, 类型: %s%n",
                    device.getDeviceId(),
                    device.getIpAddress(),
                    device.getStatus(),
                    device.getDeviceType());
        }
    }
}